package com.his.struts.util;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import javax.servlet.http.HttpServletRequest;

import org.apache.log4j.Logger;

/**
 * 分页控制类
 * 
 * @author xiaoweiliang
 */
public class PageUtil {
	Logger log = Logger.getLogger(PageUtil.class);
	private int pageSize = 10; // 每页大小

	private int rowCounts; // 总记录数

	private int pageCounts; // 页面总数

	private int curPageNum; // 当前页码

	private String connTable; // 连接的表名

	private int curPageFirst; // 当前页第一条记录的编号

	private Connection conn;

	/**
	 * 默认构造方法
	 */
	public PageUtil() {
	}

	/**
	 * 构造方法
	 * 
	 * @param conn
	 *            连接数据库
	 * @param connTable
	 *            表名
	 * @param curPageNum
	 *            当前页
	 * @param pageSize
	 *            每页大小
	 */
	public PageUtil(Connection conn, String connTable, int curPageNum,
			int pageSize) {
		this.conn = conn;
		this.connTable = connTable;
		this.curPageNum = curPageNum;
		this.pageSize = pageSize;
		this.initThePage(); // 加载配置
	}

	/**
	 * 初始化当前页的配置
	 */
	public void initThePage() {

		// 第一：先设置每页大小
		this.setPageSize(pageSize);

		// 第二：设置总记录数
		this.setRowCounts();

		// 第三：设置总页数
		this.setPageCounts();

		// 第四：设置当前页码
		this.setCurPageNum(curPageNum);

		// 第五：设置当前页第一条记录的编号
		this.setCurPageFirst(this.curPageNum);
	}

	/**
	 * 执行分页，返回一个结果集
	 * 
	 * @return rs
	 */
	public ResultSet getPage() {
		if(rowCounts <= 0){
			return null;
		}
		ResultSet rs = null;
		String sql = " select * from " + connTable + " limit ?,? ";
		try {
			PreparedStatement ps = conn.prepareStatement(sql);
			ps.setInt(1, curPageFirst);
			ps.setInt(2, pageSize);
			rs = ps.executeQuery();
		} catch (SQLException e) {
			log.error(e.getMessage());
		}
		return rs;
	}

	/**
	 * 得到每页的记录数
	 * 
	 * @return pageSize
	 */
	public int getPageSize() {
		return pageSize;
	}

	/**
	 * 设置每页的记录数
	 * 
	 * @param pageSize
	 */
	public void setPageSize(int pageSize) {
		this.pageSize = pageSize;
	}

	/**
	 * 获取总记录数
	 * 
	 * @return rowCounts
	 */
	public int getRowCounts() {
		return rowCounts;
	}

	/**
	 * 设置总的记录数
	 * 
	 * @param rowCounts
	 */
	public void setRowCounts() {
		String sql = " select count(*) from " + connTable;
		try {
			PreparedStatement ps = conn.prepareStatement(sql);
			ResultSet rs = ps.executeQuery();
			rs.next();
			rowCounts = rs.getInt(1);
		} catch (SQLException e) {
			log.error(e.getMessage());
		}
	}

	/**
	 * 获取总页数
	 * 
	 * @return pageCounts
	 */
	public int getPageCounts() {
		return pageCounts;
	}

	/**
	 * 设置总页数
	 * 
	 * @param pageCounts
	 */
	public void setPageCounts() {
		if (rowCounts % pageSize == 0) {
			pageCounts = (rowCounts / pageSize);
		} else {
			pageCounts = (rowCounts / pageSize) + 1;
		}
	}

	/**
	 * 得到当前页数
	 * 
	 * @return curPageNum
	 */
	public int getCurPageNum() {
		return curPageNum;
	}

	/**
	 * 设置当前页
	 * 
	 * @param curPageNum
	 */
	public void setCurPageNum(int curPageNum) {
		if (curPageNum <= 1) {
			this.curPageNum = 1;
		} else if (curPageNum >= this.pageCounts) {
			this.curPageNum = this.pageCounts;
		} else {
			this.curPageNum = curPageNum;
		}
	}

	/**
	 * 设置要连接的表名
	 * 
	 * @param connTable
	 */
	public void setConnTable(String connTable) {
		this.connTable = connTable;
	}

	/**
	 * 获取要连接的表名
	 * 
	 * @return
	 */
	public String getConnTable() {
		return connTable;
	}

	/**
	 * 设置当前页第一条的编号
	 * 
	 * @param curPageFirst
	 */
	public void setCurPageFirst(int curPageNum) {
		curPageFirst = (curPageNum - 1) * pageSize;
	}

	/**
	 * 获取当前页的第一条的编号
	 * 
	 * @return curPageFirst
	 */
	public int getCurPageFirst() {
		return curPageFirst;
	}

	/**
	 * 转换格式
	 * @param dqy 当前页
	 * @return 当前页
	 */
	public static int getCurrent(String dqy) {
		int current = 0;
		if (dqy == null || "".equals(dqy)||!isNumeric(dqy)) {
			current = 1;
		} else {
			current = Integer.parseInt(dqy);
			if (current <= 0) {
				current = 1;
			}
		}

		return current;
	}
	
	public static boolean isNumeric(String str){ 
		  if(str.matches("\\d *")){
		   return true; 
		  }else{
		   return false;
		  }
		 }

	
	/**
	 * 连接数据库
	 * @return
	 */
	public  Connection getConnection(){
		return new DbUtil().conn();
	}
	
	/**
	 * 通用分页方法
	 * @param sql 查询语句
	 * @param pageSize 每页的大小
	 * @param request 网页的请求
	 * @return 分页的游标
	 */
	public static ResultSet getPage(String sql,int pageSize,HttpServletRequest request){
		
		// 得到当前页
		String dqy = request.getParameter("current");
		// 转换成int型
		int currentPage = getCurrent(dqy);
		// 连接数据库
		PageUtil pu=new PageUtil();
		Connection con = pu.getConnection();

		// 调用分页类 5是每页条数
		PageUtil page = new PageUtil(con, sql, currentPage, pageSize);
		// 得到分页数据
		ResultSet rs = page.getPage();
		
		// 得到当前页
		int current = page.getCurPageNum();
		// 把当前页设置到request中
		request.setAttribute("current", current);
		// 得到总条数
		int rowCount = page.getRowCounts();
		// 把总条数设置到request中
		request.setAttribute("rowCount", rowCount);
		// 得到总页数
		int pageCount = page.getPageCounts();
		// 把总页数设置到request中
		request.setAttribute("pageCount", pageCount);
		
		return rs;
	}

}
